package com.michael.simulation.spring.beans;

import com.michael.simulation.spring.utils.StringUtils;

/**
 * 类功能描述:
 * <pre>
 *   Bean 定义接口
 * </pre>
 *
 * @author Michael
 * @version 1.0
 * @date 2020/9/3 17:09
 */
public interface BeanDefinition {

    String SCOPE_SINGLETION = "singleton";

    String SCOPE_PROTOTYPE = "prototype";

    /**
     * 类:new 构造方法的方式创建bean时，需要告诉bean工厂怎么获取类的名称
     */
    Class<?> getBeanClass();

    /**
     * Scope
     */
    String getScope();

    /**
     * 是否单例
     */
    boolean isSingleton();

    /**
     * 是否原型
     */
    boolean isPrototype();

    /**
     * 工厂bean名：成员工厂方法的方式创建bean时，需要告诉bean工厂怎么获取工厂bean名
     */
    String getFactoryBeanName();

    /**
     * 工厂方法名:静态工厂方法的方式创建bean时，需要告诉bean工厂怎么获取工厂方法名
     */
    String getFactoryMethodName();

    /**
     * 初始化方法
     */
    String getInitMethodName();

    /**
     * 销毁方法
     */
    String getDestroyMethodName();

    /**
     * 校验bean定义的合法性
     */
    default boolean validate() {
        // 没定义class,工厂bean或工厂方法没指定，则不合法。
        if (this.getBeanClass() == null) {
            if (StringUtils.hasText(getFactoryBeanName()) && StringUtils.hasText(getFactoryMethodName())) {
                return this.getBeanClass() == null || !StringUtils.hasText(getFactoryBeanName());
            }
            return false;
        }

        // 定义了类，又定义工厂bean，不合法
        return this.getBeanClass() == null || !StringUtils.hasText(getFactoryBeanName());
    }
}
